package com.warm.base.design.s_bridge;

/**
 * @Date: 2019/11/21 14:50
 * @Author: LChuang
 * @Description: 桥连模式(结构型)
 *
 *      将抽象部分与它的实现部分分离，使它们都可以独立地变化。
 *      将抽象化(Abstraction)与实现化(Implementation)脱耦
 *      {笔 和 颜色 的组合 --> {铅笔, 毛笔, 钢笔}, {red, black, green} --> 不同颜色笔的组合}
 *
 *  优点
 *     • 分离抽象接口及其实现部分。
 *     • 桥接模式有时类似于多继承方案，但是多继承方案违背了类的单一职责原则（即一个类只有一个变化的原因），
 *       复用性比较差，而且多继承结构中类的个数非常庞大，桥接模式是比多继承方案更好的解决方法。
 *     • 桥接模式提高了系统的可扩充性，在两个变化维度中任意扩展一个维度，都不需要修改原有系统。
 *     • 实现细节对客户透明，可以对用户隐藏实现细节。
 *  缺点
 *     • 桥接模式的引入会增加系统的理解与设计难度，由于聚合关联关系建立在抽象层，要求开发者针对抽象进行设计与编程。
 *     • 桥接模式要求正确识别出系统中两个独立变化的维度，因此其使用范围具有一定的局限性。
 */
public class Client {

    /**
     * Abstraction: 抽象化，定义出该角色的行为，同时保存一个对<实现化角色>的引用；
     * Implementor: 实现化，它是接口或者抽象类，定义角色必需的行为和属性；
     * RefinedAbstraction: 扩充抽象类，引用实现化角色对抽象化角色进行修正；
     * ConcreteImplementor: 实现类接口，实现接口或抽象类定义的方法或属性。
     */
    public static void main(String[] args) {
        Abstraction abs;
        Implementor impl;
        abs = new RefinedAbstractionA();
        impl = new ConcreteImplementorA();
        abs.setImplementor(impl);
        abs.abstractDo();

        abs = new RefinedAbstractionB();
        impl = new ConcreteImplementorB();
        abs.setImplementor(impl);
        abs.abstractDo();
    }
}
